package net.minecraft.pathfinding;

import net.minecraft.util.MathHelper;

public class PathPoint {
    /**
     * The x coordinate of this point
     */
    public final int xCoord;

    /**
     * The y coordinate of this point
     */
    public final int yCoord;

    /**
     * The z coordinate of this point
     */
    public final int zCoord;

    /**
     * A hash of the coordinates used to identify this point
     */
    private final int hash;

    /**
     * The index of this point in its assigned path
     */
    int index = -1;

    /**
     * The distance along the path to this point
     */
    float totalPathDistance;

    /**
     * The linear distance to the next point
     */
    float distanceToNext;

    /**
     * The distance to the target
     */
    float distanceToTarget;

    /**
     * The point preceding this in its assigned path
     */
    PathPoint previous;

    /**
     * True if the pathfinder has already visited this point
     */
    public boolean visited;
    // private static final String __OBFID = "CL_00000574";

    public PathPoint(int p_i2135_1_, int p_i2135_2_, int p_i2135_3_) {
        this.xCoord = p_i2135_1_;
        this.yCoord = p_i2135_2_;
        this.zCoord = p_i2135_3_;
        this.hash = makeHash(p_i2135_1_, p_i2135_2_, p_i2135_3_);
    }

    public static int makeHash(int p_75830_0_, int p_75830_1_, int p_75830_2_) {
        return p_75830_1_ & 255 | (p_75830_0_ & 32767) << 8 | (p_75830_2_ & 32767) << 24 | (p_75830_0_ < 0 ? Integer.MIN_VALUE : 0) | (p_75830_2_ < 0 ? 32768 : 0);
    }

    /**
     * Returns the linear distance to another path point
     */
    public float distanceTo(PathPoint p_75829_1_) {
        float var2 = (float) (p_75829_1_.xCoord - this.xCoord);
        float var3 = (float) (p_75829_1_.yCoord - this.yCoord);
        float var4 = (float) (p_75829_1_.zCoord - this.zCoord);
        return MathHelper.sqrt_float(var2 * var2 + var3 * var3 + var4 * var4);
    }

    /**
     * Returns the squared distance to another path point
     */
    public float distanceToSquared(PathPoint p_75832_1_) {
        float var2 = (float) (p_75832_1_.xCoord - this.xCoord);
        float var3 = (float) (p_75832_1_.yCoord - this.yCoord);
        float var4 = (float) (p_75832_1_.zCoord - this.zCoord);
        return var2 * var2 + var3 * var3 + var4 * var4;
    }

    public boolean equals(Object p_equals_1_) {
        if (!(p_equals_1_ instanceof PathPoint)) {
            return false;
        } else {
            PathPoint var2 = (PathPoint) p_equals_1_;
            return this.hash == var2.hash && this.xCoord == var2.xCoord && this.yCoord == var2.yCoord && this.zCoord == var2.zCoord;
        }
    }

    public int hashCode() {
        return this.hash;
    }

    /**
     * Returns true if this point has already been assigned to a path
     */
    public boolean isAssigned() {
        return this.index >= 0;
    }

    public String toString() {
        return this.xCoord + ", " + this.yCoord + ", " + this.zCoord;
    }
}
